package com.drollo77.idespensa;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DespensaDbAdapter {
	private static final String DATABASE_NAME = "idespensa"; 
	private static final int DATABASE_VERSION = 1;
	//Etiquetas para tabla de poductos
	public static final String PRODUCTOS_TABLE = "productos";
	public static final String KEY_PR_NOMBRE = "nombre_producto";
	public static final String KEY_PR_CODIGO = "codigo";
	public static final String KEY_PR_TIPO = "tipo_producto";
	public static final String KEY_PR_CANTIDAD = "unidades";
	public static final String KEY_PR_NECESARIO = "imprescindible";
	public static final String KEY_PR_ROWID = "_id";
	//Etiquetas para tabla de tipos de producto
	public static final String TIPO_PRODUCTO_TABLE = "tipo_producto";
	public static final String KEY_TP_NOMBRE = "nombre_tipo_producto";
	public static final String KEY_TP_ROWID = "_id";
	
	private DatabaseHelper mDbHelper;
	private SQLiteDatabase mDb;

	private static final String PRODUCTOS_CREATE = 
			"create table " + PRODUCTOS_TABLE + " ("
			+ KEY_PR_ROWID + " integer primary key autoincrement, "
			+ KEY_PR_NOMBRE + " text not null, "
			+ KEY_PR_CODIGO + " text not null, "
			+ KEY_PR_TIPO + " integer not null, "
			+ KEY_PR_CANTIDAD + " integer not null, "
			+ KEY_PR_NECESARIO + " integer not null);";
	private static final String TIPO_PRODUCTO_CREATE = 
			"create table " + TIPO_PRODUCTO_TABLE + " ("
			+ KEY_TP_ROWID + " integer primary key autoincrement, "
			+ KEY_TP_NOMBRE + " text not null);";
	private final Context mCtx;
	public DespensaDbAdapter(Context ctx) {
		this.mCtx = ctx;
	}
	
	private static class DatabaseHelper extends SQLiteOpenHelper {
		DatabaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}
		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(PRODUCTOS_CREATE);
			db.execSQL(TIPO_PRODUCTO_CREATE);
		}
		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// Not used, but you could upgrade the database with ALTER
			// Scripts
		}
	}
	
	public DespensaDbAdapter open() throws android.database.SQLException {
		mDbHelper = new DatabaseHelper(mCtx);
		mDb = mDbHelper.getWritableDatabase();
		return this;
	}
	
	public synchronized  void close() {
		if(mDbHelper != null){
			mDbHelper.close();
		}
	}
	
	public long nuevoProducto (String rowId,String nombre, String codigo,int tipo_prod, int cantidad, int necesario) {
		ContentValues initialValues = new ContentValues();
		if(!rowId.equals("")){
			initialValues.put(KEY_PR_ROWID, rowId);
		}
		initialValues.put(KEY_PR_NOMBRE, nombre);
		initialValues.put(KEY_PR_CODIGO, codigo);
		initialValues.put(KEY_PR_TIPO, tipo_prod);
		initialValues.put(KEY_PR_CANTIDAD, cantidad);
		initialValues.put(KEY_PR_NECESARIO, necesario);
		Cursor mCursor = mDb.query(true, PRODUCTOS_TABLE, new String[] {KEY_PR_ROWID,KEY_PR_NOMBRE, KEY_PR_CODIGO, KEY_PR_TIPO, KEY_PR_CANTIDAD, KEY_PR_NECESARIO}, KEY_PR_CODIGO + "='" + codigo + "'", null, null, null, null, null);
		if((mCursor != null) &&(mCursor.getCount()==0)){
			return mDb.insert(PRODUCTOS_TABLE, null, initialValues);
		}else{
			return (-1);
		}
	}
	
	public long nuevoTipoProducto (String Id,String nombre) {
		ContentValues initialValues = new ContentValues();
		if(!Id.equals("")){
			initialValues.put(KEY_TP_ROWID, Id);
		}
		initialValues.put(KEY_TP_NOMBRE, nombre);
		Cursor mCursor = mDb.query(true, TIPO_PRODUCTO_TABLE, new String[] {KEY_TP_ROWID}, KEY_TP_NOMBRE + "='" + nombre + "'", null, null, null, null, null);;
		if((mCursor != null) &&(mCursor.getCount()==0)){
			return mDb.insert(TIPO_PRODUCTO_TABLE, null, initialValues);
		}else{
			return (-1);
		}
		
	}
	
	public boolean borraProducto (long rowId) {
		return	mDb.delete(PRODUCTOS_TABLE, KEY_PR_ROWID + "=" + rowId, null) > 0;
	}
	
	public boolean borraTipoProducto (long rowId) {
		return	mDb.delete(TIPO_PRODUCTO_TABLE, KEY_TP_ROWID + "=" + rowId, null) > 0;
	}
	
	public Cursor listaTodosProductos() {
		return mDb.query(PRODUCTOS_TABLE, new String[] {KEY_PR_ROWID, KEY_PR_NOMBRE,KEY_PR_CODIGO, KEY_PR_TIPO, KEY_PR_CANTIDAD, KEY_PR_NECESARIO}, null, null, null, null, null);
	}
	
	public Cursor listaTodosTiposProductos() {
		return mDb.query(TIPO_PRODUCTO_TABLE, new String[] {KEY_TP_ROWID, KEY_TP_NOMBRE}, null, null, null, null, null);
	}
	
	public Cursor listaProducto (long rowId) throws SQLException {
		Cursor mCursor = mDb.query(true, PRODUCTOS_TABLE, new String[] {KEY_PR_ROWID,KEY_PR_NOMBRE, KEY_PR_CODIGO, KEY_PR_TIPO, KEY_PR_CANTIDAD, KEY_PR_NECESARIO}, KEY_PR_ROWID + "=" +	rowId, null, null, null, null, null);
		if (mCursor != null) {
			mCursor.moveToFirst();
		}
		return mCursor;
	}
	
	public Cursor listaTipoProducto (long rowId) throws SQLException {
		Cursor mCursor = mDb.query(true, TIPO_PRODUCTO_TABLE, new String[] {KEY_TP_ROWID,KEY_TP_NOMBRE}, KEY_TP_ROWID + "=" +	rowId, null, null, null, null, null);
		if (mCursor != null) {
			mCursor.moveToFirst();
		}
		return mCursor;
	}
	
	public boolean actualizaProducto (long rowId, int cantidad) {
		ContentValues args = new ContentValues();
		args.put(KEY_PR_CANTIDAD, cantidad);
		return mDb.update(PRODUCTOS_TABLE, args, KEY_PR_ROWID + "=" + rowId, null) > 0;
	}
	
	public Cursor buscaProductoporCodigo (String codigo){
		Cursor mCursor = mDb.query(true, PRODUCTOS_TABLE, new String[] {KEY_PR_ROWID, KEY_PR_CANTIDAD}, KEY_PR_CODIGO + "='" + codigo + "'", null, null, null, null, null);
		return mCursor;
	}
	
	public void limpia (String nombre_tabla){
		mDb.execSQL("DROP TABLE IF EXISTS " + nombre_tabla);
		if(nombre_tabla.equals("tipo_producto")){
			mDb.execSQL(TIPO_PRODUCTO_CREATE);
		}else if(nombre_tabla.equals("productos")){
			mDb.execSQL(PRODUCTOS_CREATE);
		}
	}
	
	public void inicia_transaccion (){
		mDb.beginTransaction();
	}
	
	public boolean transaccion_activa (){
		if(mDb.inTransaction()){
			return true;
		}else{
			return false;
		}
	}
	
	public void fin_transaccion(boolean result){
		if(result == true){
			try{
				mDb.setTransactionSuccessful();
			}catch (Exception e){
				Log.d("database_adapter","error al marcar la transaccion");
			}			
		}
		mDb.endTransaction();
	}
	
	public boolean corrigeId (Long oldId,Long newId,String nombreTabla){
		ContentValues args = new ContentValues();
		args.put(KEY_PR_ROWID, newId);
		return (mDb.update(nombreTabla, args, KEY_PR_ROWID + "=" + oldId, null) > 0);
	}
	
	public Cursor listaCompra() {
		return mDb.query(true, PRODUCTOS_TABLE, new String[] {KEY_PR_ROWID,KEY_PR_NOMBRE,KEY_PR_TIPO,KEY_PR_CANTIDAD}, KEY_PR_NECESARIO + "= 1", null, null, null, null, null);
	}
	
	public boolean isLocked (){
		return mDb.isDbLockedByCurrentThread();
	}
}
